﻿2026-05-10T12:09:48.0768371Z ##[group]Run pnpm verify:phase-5
2026-05-10T12:09:48.0768709Z [36;1mpnpm verify:phase-5[0m
2026-05-10T12:09:48.0790089Z shell: /usr/bin/bash -e {0}
2026-05-10T12:09:48.0790335Z env:
2026-05-10T12:09:48.0790583Z   PNPM_HOME: /home/runner/setup-pnpm/node_modules/.bin
2026-05-10T12:09:48.0790890Z   SKIP_PHASE_3_CARRYOVER: 1
2026-05-10T12:09:48.0791125Z   SKIP_TRACE_CHECK: 1
2026-05-10T12:09:48.0791317Z ##[endgroup]
2026-05-10T12:09:48.3846421Z 
2026-05-10T12:09:48.3847570Z > rebno@0.0.0 verify:phase-5 /home/runner/work/rebno/rebno
2026-05-10T12:09:48.3848892Z > node scripts/verify-phase-5.mjs
2026-05-10T12:09:48.3849558Z 
2026-05-10T12:09:48.4164556Z 
2026-05-10T12:09:48.4165464Z === Phase 4 carry-over: verify-phase-4 ===
2026-05-10T12:09:48.4166392Z >>> pnpm verify:phase-4
2026-05-10T12:09:48.7281179Z 
2026-05-10T12:09:48.7282620Z > rebno@0.0.0 verify:phase-4 /home/runner/work/rebno/rebno
2026-05-10T12:09:48.7283783Z > node scripts/verify-phase-4.mjs
2026-05-10T12:09:48.7284435Z 
2026-05-10T12:09:48.7590608Z 
2026-05-10T12:09:48.7591509Z === Workspace: typecheck ===
2026-05-10T12:09:48.7592846Z >>> pnpm -r typecheck
2026-05-10T12:09:49.1130124Z Scope: 5 of 6 workspace projects
2026-05-10T12:09:49.1187653Z packages/db typecheck$ tsc --noEmit
2026-05-10T12:09:49.1196563Z packages/game-logic typecheck$ tsc --noEmit
2026-05-10T12:09:51.7183389Z packages/game-logic typecheck: Done
2026-05-10T12:09:51.7193763Z packages/protocol typecheck$ tsc --noEmit
2026-05-10T12:09:53.8667716Z packages/db typecheck: Done
2026-05-10T12:09:55.1466558Z packages/protocol typecheck: Done
2026-05-10T12:09:55.1473438Z apps/client typecheck$ tsc --noEmit
2026-05-10T12:09:55.1476561Z apps/server typecheck$ tsc --noEmit
2026-05-10T12:10:06.2513035Z apps/client typecheck: Done
2026-05-10T12:10:07.4825082Z apps/server typecheck: Done
2026-05-10T12:10:07.4932991Z 
2026-05-10T12:10:07.4933747Z === Lint: protocol-sync ===
2026-05-10T12:10:07.4934404Z >>> pnpm lint:protocol-sync
2026-05-10T12:10:07.8024091Z 
2026-05-10T12:10:07.8025196Z > rebno@0.0.0 lint:protocol-sync /home/runner/work/rebno/rebno
2026-05-10T12:10:07.8026460Z > node tools/scripts/lint-protocol-sync.mjs
2026-05-10T12:10:07.8027046Z 
2026-05-10T12:10:07.8334739Z lint-protocol-sync: OK
2026-05-10T12:10:07.8454677Z 
2026-05-10T12:10:07.8455426Z === Lint: game-logic-purity ===
2026-05-10T12:10:07.8456373Z >>> pnpm lint:game-logic-purity
2026-05-10T12:10:08.1636285Z 
2026-05-10T12:10:08.1637355Z > rebno@0.0.0 lint:game-logic-purity /home/runner/work/rebno/rebno
2026-05-10T12:10:08.1638588Z > node tools/scripts/lint-game-logic-purity.mjs
2026-05-10T12:10:08.1639225Z 
2026-05-10T12:10:08.1945215Z lint-game-logic-purity: OK (6 file(s) clean)
2026-05-10T12:10:08.2063317Z 
2026-05-10T12:10:08.2064006Z === Lint: better-auth-schema-sync ===
2026-05-10T12:10:08.2064899Z >>> pnpm lint:better-auth-schema-sync
2026-05-10T12:10:08.5196467Z 
2026-05-10T12:10:08.5197614Z > rebno@0.0.0 lint:better-auth-schema-sync /home/runner/work/rebno/rebno
2026-05-10T12:10:08.5199017Z > node tools/scripts/lint-better-auth-schema-sync.mjs
2026-05-10T12:10:08.5199669Z 
2026-05-10T12:10:10.0661374Z lint-better-auth-schema-sync: OK
2026-05-10T12:10:10.0784785Z 
2026-05-10T12:10:10.0785468Z === Lint: rate-limit-budgets ===
2026-05-10T12:10:10.0786209Z >>> pnpm lint:rate-limit-budgets
2026-05-10T12:10:10.3923339Z 
2026-05-10T12:10:10.3924992Z > rebno@0.0.0 lint:rate-limit-budgets /home/runner/work/rebno/rebno
2026-05-10T12:10:10.3926107Z > node tools/scripts/lint-rate-limit-budgets.mjs
2026-05-10T12:10:10.3926631Z 
2026-05-10T12:10:10.4230888Z lint-rate-limit-budgets: OK (5 D-22 budgets locked)
2026-05-10T12:10:10.4350122Z 
2026-05-10T12:10:10.4350854Z === Lint: no-clipboard-rce ===
2026-05-10T12:10:10.4353851Z >>> pnpm lint:no-clipboard-rce
2026-05-10T12:10:10.7454578Z 
2026-05-10T12:10:10.7476078Z > rebno@0.0.0 lint:no-clipboard-rce /home/runner/work/rebno/rebno
2026-05-10T12:10:10.7477100Z > node tools/scripts/lint-no-clipboard-rce.mjs
2026-05-10T12:10:10.7478037Z 
2026-05-10T12:10:10.7785090Z lint-no-clipboard-rce: OK (21 file(s) clean)
2026-05-10T12:10:10.7916185Z 
2026-05-10T12:10:10.7916964Z === Lint: room-layout ===
2026-05-10T12:10:10.7919324Z >>> pnpm lint:room-layout
2026-05-10T12:10:11.1031446Z 
2026-05-10T12:10:11.1043417Z > rebno@0.0.0 lint:room-layout /home/runner/work/rebno/rebno
2026-05-10T12:10:11.1044808Z > node tools/scripts/lint-room-layout.mjs
2026-05-10T12:10:11.1045868Z 
2026-05-10T12:10:11.1376297Z lint-room-layout: OK
2026-05-10T12:10:11.1498127Z 
2026-05-10T12:10:11.1498776Z === ADR 0004 lint ===
2026-05-10T12:10:11.1499486Z >>> pnpm lint:adr:0004
2026-05-10T12:10:11.4638028Z 
2026-05-10T12:10:11.4643188Z > rebno@0.0.0 lint:adr:0004 /home/runner/work/rebno/rebno
2026-05-10T12:10:11.4644812Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0004-room-hot-reload.md --no-matrix
2026-05-10T12:10:11.4646166Z 
2026-05-10T12:10:11.4952625Z OK: ADR docs/adr/0004-room-hot-reload.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-10T12:10:11.5083052Z 
2026-05-10T12:10:11.5084003Z === Drizzle: emit-check ===
2026-05-10T12:10:11.5085308Z >>> pnpm db:emit-check
2026-05-10T12:10:11.8190194Z 
2026-05-10T12:10:11.8211619Z > rebno@0.0.0 db:emit-check /home/runner/work/rebno/rebno
2026-05-10T12:10:11.8214188Z > pnpm -C packages/db exec drizzle-kit generate && node -e "require('fs').copyFileSync('packages/db/migrations/0001_baseline.sql','docs/extracted-server/0001_baseline.sql')" && git diff --exit-code packages/db/migrations/0001_baseline.sql docs/extracted-server/0001_baseline.sql
2026-05-10T12:10:11.8228193Z 
2026-05-10T12:10:12.2875529Z No config path provided, using default 'drizzle.config.ts'
2026-05-10T12:10:12.2880186Z Reading config file '/home/runner/work/rebno/rebno/packages/db/drizzle.config.ts'
2026-05-10T12:10:12.6639233Z 8 tables
2026-05-10T12:10:12.6640584Z accounts 8 columns 1 indexes 0 fks
2026-05-10T12:10:12.6641633Z audit_log 6 columns 0 indexes 2 fks
2026-05-10T12:10:12.6642875Z characters 9 columns 0 indexes 1 fks
2026-05-10T12:10:12.6643717Z inventory_items 4 columns 0 indexes 1 fks
2026-05-10T12:10:12.6644603Z legacy_credentials_staging 6 columns 0 indexes 0 fks
2026-05-10T12:10:12.6645429Z message_board_replies 5 columns 0 indexes 2 fks
2026-05-10T12:10:12.6646343Z message_board_topics 7 columns 0 indexes 1 fks
2026-05-10T12:10:12.6647202Z sessions 5 columns 0 indexes 1 fks
2026-05-10T12:10:12.6647750Z 
2026-05-10T12:10:12.6648583Z No schema changes, nothing to migrate 😴
2026-05-10T12:10:12.7860781Z 
2026-05-10T12:10:12.7861608Z === Drizzle: schema-sync ===
2026-05-10T12:10:12.7862917Z >>> pnpm lint:schema-sync
2026-05-10T12:10:13.1003089Z 
2026-05-10T12:10:13.1004210Z > rebno@0.0.0 lint:schema-sync /home/runner/work/rebno/rebno
2026-05-10T12:10:13.1007957Z > node -e "const a=require('fs').readFileSync('packages/db/migrations/0001_baseline.sql');const b=require('fs').readFileSync('docs/extracted-server/0001_baseline.sql');if(Buffer.compare(a,b)!==0){console.error('docs/extracted-server/0001_baseline.sql out of sync with packages/db/migrations/0001_baseline.sql');process.exit(1)}console.log('OK')"
2026-05-10T12:10:13.1010696Z 
2026-05-10T12:10:13.1275183Z OK
2026-05-10T12:10:13.1400517Z 
2026-05-10T12:10:13.1401427Z === Drizzle: source-comments ===
2026-05-10T12:10:13.1402580Z >>> pnpm lint:source-comments
2026-05-10T12:10:13.4712284Z 
2026-05-10T12:10:13.4713987Z > rebno@0.0.0 lint:source-comments /home/runner/work/rebno/rebno
2026-05-10T12:10:13.4715647Z > pnpm -C packages/db run lint:source-comments
2026-05-10T12:10:13.4716275Z 
2026-05-10T12:10:13.7872864Z 
2026-05-10T12:10:13.7874070Z > @rebno/db@0.1.0 lint:source-comments /home/runner/work/rebno/rebno/packages/db
2026-05-10T12:10:13.7875262Z > node scripts/check-source-comments.mjs
2026-05-10T12:10:13.7875850Z 
2026-05-10T12:10:13.8183775Z check-source-comments: OK (50 columns, all SOURCE-cited)
2026-05-10T12:10:13.8412991Z 
2026-05-10T12:10:13.8413756Z === Workspace: test ===
2026-05-10T12:10:13.8414392Z >>> pnpm -r test
2026-05-10T12:10:14.1565779Z Scope: 5 of 6 workspace projects
2026-05-10T12:10:14.1623201Z packages/db test$ vitest run
2026-05-10T12:10:14.1632930Z packages/game-logic test$ vitest run
2026-05-10T12:10:14.6808192Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-10T12:10:14.6844026Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-10T12:10:15.0551719Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 26[2mms[22m[39m
2026-05-10T12:10:15.2765819Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-10T12:10:15.5304264Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T12:10:15.6773468Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-10T12:10:15.7768228Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T12:10:15.7868267Z packages/game-logic test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-10T12:10:15.7906485Z packages/game-logic test: [2m      Tests [22m [1m[32m21 passed[39m[22m[90m (21)[39m
2026-05-10T12:10:15.7913315Z packages/game-logic test: [2m   Start at [22m 12:10:14
2026-05-10T12:10:15.7933951Z packages/game-logic test: [2m   Duration [22m 1.10s[2m (transform 120ms, setup 0ms, import 207ms, tests 55ms, environment 1ms)[22m
2026-05-10T12:10:15.8302823Z packages/game-logic test: Done
2026-05-10T12:10:15.8308504Z packages/protocol test$ vitest run
2026-05-10T12:10:15.9089460Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T12:10:16.3894498Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-10T12:10:16.7590840Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-10T12:10:16.7670289Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-10T12:10:16.7690469Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-10T12:10:16.7723054Z packages/db test: [2m   Start at [22m 12:10:14
2026-05-10T12:10:16.7743845Z packages/db test: [2m   Duration [22m 2.07s[2m (transform 183ms, setup 0ms, import 1.44s, tests 31ms, environment 1ms)[22m
2026-05-10T12:10:16.7982826Z packages/db test: Done
2026-05-10T12:10:16.8488465Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 31[2mms[22m[39m
2026-05-10T12:10:17.0114530Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T12:10:17.1808580Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T12:10:17.3349790Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T12:10:17.3376194Z packages/protocol test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-10T12:10:17.3385815Z packages/protocol test: [2m      Tests [22m [1m[32m30 passed[39m[22m[90m (30)[39m
2026-05-10T12:10:17.3387256Z packages/protocol test: [2m   Start at [22m 12:10:16
2026-05-10T12:10:17.3389107Z packages/protocol test: [2m   Duration [22m 941ms[2m (transform 168ms, setup 0ms, import 308ms, tests 48ms, environment 0ms)[22m
2026-05-10T12:10:17.3710413Z packages/protocol test: Done
2026-05-10T12:10:17.3715387Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-10T12:10:17.3719581Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-10T12:10:17.9234697Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-10T12:10:17.9944229Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-10T12:10:19.0068619Z apps/server test: {"level":30,"time":1778415019003,"pid":4405,"hostname":"runnervmeorf1","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-10T12:10:19.0101766Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 768[2mms[22m[39m
2026-05-10T12:10:19.0139133Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 602[2mms[22m[39m
2026-05-10T12:10:19.4176687Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 160[2mms[22m[39m
2026-05-10T12:10:20.2421617Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 57[2mms[22m[39m
2026-05-10T12:10:20.7674972Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-10T12:10:20.7703925Z apps/client test: [22m[39mroom_layout signature did not verify — rendering skipped for mvp-lobby 000
2026-05-10T12:10:20.7812719Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 148[2mms[22m[39m
2026-05-10T12:10:21.2550454Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-10T12:10:21.2585122Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-ErA6Tr/rebno.db
2026-05-10T12:10:21.2586615Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T12:10:21.2587416Z apps/server test: [run-migrations] OK
2026-05-10T12:10:21.2712722Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-10T12:10:21.2719003Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-rd8DZo/rebno.db
2026-05-10T12:10:21.2733684Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T12:10:21.2737775Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-10T12:10:21.2756280Z apps/server test: [run-migrations] OK
2026-05-10T12:10:21.2913490Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-10T12:10:21.2940783Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-IrT59l/rebno.db
2026-05-10T12:10:21.2969477Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T12:10:21.2970542Z apps/server test: [run-migrations] OK
2026-05-10T12:10:21.3203700Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-10T12:10:21.3205954Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-IrT59l/rebno.db
2026-05-10T12:10:21.3207482Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T12:10:21.3208575Z apps/server test: [run-migrations] OK
2026-05-10T12:10:21.3210134Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 62[2mms[22m[39m
2026-05-10T12:10:21.6414616Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 19[2mms[22m[39m
2026-05-10T12:10:21.9324890Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 23[2mms[22m[39m
2026-05-10T12:10:22.0262804Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 112[2mms[22m[39m
2026-05-10T12:10:22.2034218Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 31[2mms[22m[39m
2026-05-10T12:10:22.5294093Z apps/server test: {"level":40,"time":1778415022526,"pid":4536,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T12:10:22.5370510Z apps/server test: {"level":40,"time":1778415022529,"pid":4536,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T12:10:22.5399826Z apps/server test: {"level":40,"time":1778415022530,"pid":4536,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T12:10:22.5413880Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-10T12:10:22.7842738Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-10T12:10:23.0140327Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T12:10:23.2289037Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 121[2mms[22m[39m
2026-05-10T12:10:23.8451006Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-10T12:10:23.8483909Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ⌘ override existing { override: true }
2026-05-10T12:10:23.8493145Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-10T12:10:24.4398405Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 35[2mms[22m[39m
2026-05-10T12:10:24.6284203Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T12:10:24.8563628Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T12:10:24.8636886Z apps/server test: [2m Test Files [22m [1m[32m11 passed[39m[22m[90m (11)[39m
2026-05-10T12:10:24.8663508Z apps/server test: [2m      Tests [22m [1m[32m61 passed[39m[22m[90m (61)[39m
2026-05-10T12:10:24.8664904Z apps/server test: [2m   Start at [22m 12:10:17
2026-05-10T12:10:24.8681818Z apps/server test: [2m   Duration [22m 6.92s[2m (transform 486ms, setup 0ms, import 3.54s, tests 1.01s, environment 2ms)[22m
2026-05-10T12:10:24.9141652Z apps/server test: Done
2026-05-10T12:10:25.4160613Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-10T12:10:26.1042670Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-10T12:10:26.7876302Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-10T12:10:27.4796731Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-10T12:10:28.1601603Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T12:10:28.8524694Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T12:10:29.5615894Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-10T12:10:30.2355629Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T12:10:30.9474062Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T12:10:31.6328322Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T12:10:32.3006864Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 4[2mms[22m[39m
2026-05-10T12:10:32.3224473Z apps/client test: [2m Test Files [22m [1m[32m16 passed[39m[22m[90m (16)[39m
2026-05-10T12:10:32.3226617Z apps/client test: [2m      Tests [22m [1m[32m98 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (102)[39m
2026-05-10T12:10:32.3235475Z apps/client test: [2m   Start at [22m 12:10:17
2026-05-10T12:10:32.3237392Z apps/client test: [2m   Duration [22m 14.33s[2m (transform 479ms, setup 46ms, collect 788ms, tests 661ms, environment 8.13s, prepare 1.71s)[22m
2026-05-10T12:10:32.4597070Z apps/client test: Done
2026-05-10T12:10:32.4681177Z 
2026-05-10T12:10:32.4682391Z verify-phase-4: OK (12 steps green)
2026-05-10T12:10:32.4802976Z 
2026-05-10T12:10:32.4803752Z === Workspace: typecheck ===
2026-05-10T12:10:32.4804572Z >>> pnpm -r typecheck
2026-05-10T12:10:32.8019695Z Scope: 5 of 6 workspace projects
2026-05-10T12:10:32.8079370Z packages/db typecheck$ tsc --noEmit
2026-05-10T12:10:32.8089534Z packages/game-logic typecheck$ tsc --noEmit
2026-05-10T12:10:35.4103668Z packages/game-logic typecheck: Done
2026-05-10T12:10:35.4143054Z packages/protocol typecheck$ tsc --noEmit
2026-05-10T12:10:37.6458886Z packages/db typecheck: Done
2026-05-10T12:10:38.9554692Z packages/protocol typecheck: Done
2026-05-10T12:10:38.9562991Z apps/server typecheck$ tsc --noEmit
2026-05-10T12:10:38.9572894Z apps/client typecheck$ tsc --noEmit
2026-05-10T12:10:49.6316891Z apps/client typecheck: Done
2026-05-10T12:10:51.2186118Z apps/server typecheck: Done
2026-05-10T12:10:51.2282750Z 
2026-05-10T12:10:51.2283434Z === Lint: deploy-stack ===
2026-05-10T12:10:51.2284590Z >>> pnpm lint:deploy-stack
2026-05-10T12:10:51.5454579Z 
2026-05-10T12:10:51.5455861Z > rebno@0.0.0 lint:deploy-stack /home/runner/work/rebno/rebno
2026-05-10T12:10:51.5457495Z > node tools/scripts/lint-deploy-stack.mjs
2026-05-10T12:10:51.5458266Z 
2026-05-10T12:10:51.5781170Z lint-deploy-stack: OK
2026-05-10T12:10:51.5916334Z 
2026-05-10T12:10:51.5917256Z === Lint: deploy-stack test ===
2026-05-10T12:10:51.5918492Z >>> pnpm lint:deploy-stack:test
2026-05-10T12:10:51.9077125Z 
2026-05-10T12:10:51.9081306Z > rebno@0.0.0 lint:deploy-stack:test /home/runner/work/rebno/rebno
2026-05-10T12:10:51.9084457Z > node tools/scripts/lint-deploy-stack.test.mjs
2026-05-10T12:10:51.9084887Z 
2026-05-10T12:10:51.9695262Z PASS: lint-deploy-stack green
2026-05-10T12:10:51.9830469Z 
2026-05-10T12:10:51.9830955Z === ADR 0005 lint ===
2026-05-10T12:10:51.9831504Z >>> pnpm lint:adr:0005
2026-05-10T12:10:52.2955867Z 
2026-05-10T12:10:52.2956884Z > rebno@0.0.0 lint:adr:0005 /home/runner/work/rebno/rebno
2026-05-10T12:10:52.2958383Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0005-deploy-topology.md --no-matrix
2026-05-10T12:10:52.2959299Z 
2026-05-10T12:10:52.3274223Z OK: ADR docs/adr/0005-deploy-topology.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-10T12:10:52.3401532Z 
2026-05-10T12:10:52.3402666Z === ADR 0006 lint ===
2026-05-10T12:10:52.3403462Z >>> pnpm lint:adr:0006
2026-05-10T12:10:52.6533795Z 
2026-05-10T12:10:52.6534911Z > rebno@0.0.0 lint:adr:0006 /home/runner/work/rebno/rebno
2026-05-10T12:10:52.6536698Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0006-observability-stack.md --no-matrix
2026-05-10T12:10:52.6537735Z 
2026-05-10T12:10:52.6843974Z OK: ADR docs/adr/0006-observability-stack.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-10T12:10:52.6966141Z 
2026-05-10T12:10:52.6966880Z === Workspace: test ===
2026-05-10T12:10:52.6968137Z >>> pnpm -r test
2026-05-10T12:10:53.0176604Z Scope: 5 of 6 workspace projects
2026-05-10T12:10:53.0235967Z packages/game-logic test$ vitest run
2026-05-10T12:10:53.0245655Z packages/db test$ vitest run
2026-05-10T12:10:53.5520773Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-10T12:10:53.5534596Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-10T12:10:53.9239940Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-10T12:10:54.1654230Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 19[2mms[22m[39m
2026-05-10T12:10:54.4090451Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T12:10:54.5801021Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-10T12:10:54.6375617Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T12:10:54.6437371Z packages/game-logic test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-10T12:10:54.6443585Z packages/game-logic test: [2m      Tests [22m [1m[32m21 passed[39m[22m[90m (21)[39m
2026-05-10T12:10:54.6463714Z packages/game-logic test: [2m   Start at [22m 12:10:53
2026-05-10T12:10:54.6478067Z packages/game-logic test: [2m   Duration [22m 1.08s[2m (transform 133ms, setup 0ms, import 229ms, tests 49ms, environment 1ms)[22m
2026-05-10T12:10:54.6884173Z packages/game-logic test: Done
2026-05-10T12:10:54.6894184Z packages/protocol test$ vitest run
2026-05-10T12:10:55.1789115Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-10T12:10:55.5356640Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-10T12:10:55.5848033Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 22[2mms[22m[39m
2026-05-10T12:10:55.7906115Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T12:10:55.8004365Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-10T12:10:55.8023583Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-10T12:10:55.8062613Z packages/db test: [2m   Start at [22m 12:10:53
2026-05-10T12:10:55.8064505Z packages/db test: [2m   Duration [22m 2.24s[2m (transform 195ms, setup 0ms, import 1.53s, tests 36ms, environment 1ms)[22m
2026-05-10T12:10:55.8264358Z packages/db test: Done
2026-05-10T12:10:55.8457409Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T12:10:56.0180586Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T12:10:56.1912740Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-10T12:10:56.1963651Z packages/protocol test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-10T12:10:56.1970641Z packages/protocol test: [2m      Tests [22m [1m[32m30 passed[39m[22m[90m (30)[39m
2026-05-10T12:10:56.1983272Z packages/protocol test: [2m   Start at [22m 12:10:55
2026-05-10T12:10:56.1984783Z packages/protocol test: [2m   Duration [22m 1.01s[2m (transform 135ms, setup 0ms, import 275ms, tests 38ms, environment 1ms)[22m
2026-05-10T12:10:56.2278668Z packages/protocol test: Done
2026-05-10T12:10:56.2284221Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-10T12:10:56.2287182Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-10T12:10:56.8174406Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-10T12:10:56.8295000Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-10T12:10:57.9141078Z apps/server test: {"level":30,"time":1778415057909,"pid":5267,"hostname":"runnervmeorf1","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-10T12:10:57.9184179Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 749[2mms[22m[39m
2026-05-10T12:10:57.9203742Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 604[2mms[22m[39m
2026-05-10T12:10:58.2488125Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 140[2mms[22m[39m
2026-05-10T12:10:58.9975197Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-10T12:10:58.9993661Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-8qULrq/rebno.db
2026-05-10T12:10:59.0009177Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T12:10:59.0032888Z apps/server test: [run-migrations] OK
2026-05-10T12:10:59.0090374Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-10T12:10:59.0107305Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-yz4p9P/rebno.db
2026-05-10T12:10:59.0121947Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T12:10:59.0127915Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-10T12:10:59.0153731Z apps/server test: [run-migrations] OK
2026-05-10T12:10:59.0224516Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-10T12:10:59.0265364Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-6hRlmK/rebno.db
2026-05-10T12:10:59.0268846Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T12:10:59.0271638Z apps/server test: [run-migrations] OK
2026-05-10T12:10:59.0294450Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-10T12:10:59.0359787Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-6hRlmK/rebno.db
2026-05-10T12:10:59.0361594Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T12:10:59.0363644Z apps/server test: [run-migrations] OK
2026-05-10T12:10:59.0365953Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 54[2mms[22m[39m
2026-05-10T12:10:59.6366008Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-10T12:10:59.6389184Z apps/client test: [22m[39mroom_layout signature did not verify — rendering skipped for mvp-lobby 000
2026-05-10T12:10:59.6404009Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 133[2mms[22m[39m
2026-05-10T12:11:00.1724079Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 52[2mms[22m[39m
2026-05-10T12:11:00.4978772Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 24[2mms[22m[39m
2026-05-10T12:11:00.7726637Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 24[2mms[22m[39m
2026-05-10T12:11:00.8674929Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 129[2mms[22m[39m
2026-05-10T12:11:01.0657388Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-10T12:11:01.3723152Z apps/server test: {"level":40,"time":1778415061368,"pid":5398,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T12:11:01.3977405Z apps/server test: {"level":40,"time":1778415061372,"pid":5398,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T12:11:01.4070424Z apps/server test: {"level":40,"time":1778415061373,"pid":5398,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T12:11:01.4077394Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-10T12:11:01.6337808Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-10T12:11:01.8814195Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-10T12:11:02.0998092Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 110[2mms[22m[39m
2026-05-10T12:11:02.7683862Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-10T12:11:02.7685714Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ⌘ custom filepath { path: '/custom/path/.env' }
2026-05-10T12:11:03.2714825Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-10T12:11:03.2716538Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 37[2mms[22m[39m
2026-05-10T12:11:03.5109827Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T12:11:03.8560986Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T12:11:03.8649839Z apps/server test: [2m Test Files [22m [1m[32m11 passed[39m[22m[90m (11)[39m
2026-05-10T12:11:03.8666547Z apps/server test: [2m      Tests [22m [1m[32m61 passed[39m[22m[90m (61)[39m
2026-05-10T12:11:03.8686764Z apps/server test: [2m   Start at [22m 12:10:56
2026-05-10T12:11:03.8706623Z apps/server test: [2m   Duration [22m 7.03s[2m (transform 482ms, setup 0ms, import 3.55s, tests 970ms, environment 2ms)[22m
2026-05-10T12:11:03.9133857Z apps/server test: Done
2026-05-10T12:11:04.1767552Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-10T12:11:04.9782697Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-10T12:11:05.6865781Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-10T12:11:06.3804155Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-10T12:11:07.0633346Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T12:11:07.7367904Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T12:11:08.4363035Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-10T12:11:09.1050765Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T12:11:09.7834413Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T12:11:10.4304801Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T12:11:11.1052915Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 4[2mms[22m[39m
2026-05-10T12:11:11.1253846Z apps/client test: [2m Test Files [22m [1m[32m16 passed[39m[22m[90m (16)[39m
2026-05-10T12:11:11.1268543Z apps/client test: [2m      Tests [22m [1m[32m98 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (102)[39m
2026-05-10T12:11:11.1278044Z apps/client test: [2m   Start at [22m 12:10:56
2026-05-10T12:11:11.1288853Z apps/client test: [2m   Duration [22m 14.29s[2m (transform 551ms, setup 50ms, collect 826ms, tests 632ms, environment 8.31s, prepare 1.64s)[22m
2026-05-10T12:11:11.2587156Z apps/client test: Done
2026-05-10T12:11:11.2673807Z 
2026-05-10T12:11:11.2674425Z verify-phase-5: OK (7 steps green)
